<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    /* 
        访问一个对象的原形对象
            对象.__proto__
            Object.getPrototypeOf(对象)
        原型对象中的数据：
           1.对象中的数据（属性、方法等）
           2.constructor(对象的构造函数)
        注意 ：
            原型对象也有原型，这样就构成了一条原型链，根据对象的复杂程度不同，原型链的长度也不同
        原型链：
            -读取对象属性时，会优先读取对象自身属性
            -如果对象自身没有该属性，则会读取对象的原型属性
            -如果原型对象也没有该属性，则会继续读取原型对象的原型属性，直到找到该属性或到达原型链的尽头（Null）
        - 作用域链，是找变量的链，找不到会报错
        - 原型链，是找属性的链，找不到返回undefined
    */
    class Person {
      name = "孙悟空";
      age = 12;
      sayHello() {}
    }
    let p1 = new Person();
    console.log(p1.__proto__); //访问一个对象的原形
    console.log(Object.getPrototypeOf(p1)); //访问一个对象的原形
    console.log(p1.constructor == Person);
    console.log(p1.__proto__.constructor);
    console.log(Person.prototype.__proto__.__proto__);
  </script>
</html>
